/* 
模块系统中，每个模块都是相互独立的
模块内部定义的变量或者方法是私有的，只能在模块内部使用，而模块外部不能加载
如果模块需要将部分功能对外提供使用，可以通过特定的语法公开 

*/
/* 
模块作用域变量：node环境下由node提供的类似于全局变量的特殊变量，但是该变量值和模块本身有关系
    类似于全局变量：任何模块文件中都无需定义，直接可用
    不同的模块使用该变量时候，值不同 
    
*/

console.log("文件真实路径(不带文件名)",__dirname);
console.log("文件真实路径(带文件名)",__filename);
console.log("exports",exports);
console.log("module",module);
console.log(exports===module.exports);

/* 模块包装器:
    保持顶层的变量（用 var、 const 或 let 定义）作用在模块范围内，而不是全局对象。
    有助于提供一些==模块级的共享变量或方法==
    可以获取==文件级的模块导出对象 module.exports 或者 exports ==。
    提供模块绝对==文件名和目录路径的变量 __filename 和 __dirname== 。 
    
*/
//基于module对象提供的模块的基本信息，衍生出了各种模块作用域变量
// node模块的包装器，实际上就类似于如下结果
// (function(module){
//     let exports = module.exports;
//     let __filename = module.filename;
//     let __dirname = module.path;
//     //----->
//     // 模块代码在这里
//     //<-----
//     return module.epxorts;
//  });
//  let api=require("./module3/moduleA");
//  console.log(api);


/* (function(形参) {
    let moduleA = "moduleA变量";
    exports.printA = function () {
        console.log("输出变量", moduleA);
    };
    exports.printFileName = function () {
        console.log("__filename", __filename);
    };
    exports.printDirName = function () {
        console.log("__dirname", __dirname);
    };
    console.log(exports);
})(实参);
等同于require("实参") */